package com.ruoyi.controller;

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.domain.DailyReport;
import com.ruoyi.domain.ReportItem;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.service.DailyReportService;
import com.ruoyi.utils.TimeRangeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.ParseException;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;

/**
 * 日报管理模块 - 控制器层
 * 负责处理日报相关的 HTTP 请求
 */
@RestController
@RequestMapping("/reports")
public class DailyReportController {

    @Autowired
    private DailyReportService dailyReportService;

    @Autowired
    private TokenService tokenService;

    @Value("${file.upload-dir}")
    private String uploadDir;  // 从配置文件读取文件存储路径



    /**
     * 获取日报列表（分页和条件查询）
     *
     * @param params 请求参数（分页和查询条件）
     * @param request HTTP 请求，用于获取当前用户
     * @return 分页后的日报列表
     */
//    @PreAuthorize("hasAuthority('report:list')")
    @GetMapping("/list")
    public AjaxResult listReports(@RequestParam Map<String, Object> params, HttpServletRequest request) {
        SysUser currentUser = tokenService.getLoginUser(request).getUser();
        Map<String, Object> reportList = dailyReportService.getReportList(params, currentUser);
        return AjaxResult.success(reportList);
    }

    /**
     * 新增日报
     *
     * @param report 日报对象
     * @param request HTTP 请求，用于获取当前用户
     * @return 操作结果
     */
//    @PreAuthorize("hasAuthority('report:add')")
    @PostMapping("/add")
    public AjaxResult addReport(@RequestBody DailyReport report, HttpServletRequest request) {
        SysUser currentUser = tokenService.getLoginUser(request).getUser();
        AjaxResult ajaxResult = dailyReportService.addReport(report, currentUser);
        return AjaxResult.success(ajaxResult);
    }

    /**
     * 编辑现有日报
     *
     * @param id 日报 ID
     * @param report 修改后的日报对象
     * @param request HTTP 请求，用于获取当前用户
     * @return 操作结果
     */
//    @PreAuthorize("hasAuthority('report:edit')")
    @PutMapping("/edit/{id}")
    public AjaxResult editReport(@PathVariable Long id, @RequestBody DailyReport report, HttpServletRequest request) {
        SysUser currentUser = tokenService.getLoginUser(request).getUser();
        AjaxResult ajaxResult = dailyReportService.editReport(id, report, currentUser);
        return AjaxResult.success(ajaxResult);
    }

    /**
     * 删除指定日报
     *
     * @param id 日报 ID
     * @return 操作结果
     */
//    @PreAuthorize("hasAuthority('report:delete')")
    @DeleteMapping("/delete/{id}")
    public AjaxResult deleteReport(@PathVariable Long id) {
        AjaxResult ajaxResult = dailyReportService.deleteReport(id);
        return AjaxResult.success(ajaxResult);

    }

    /**
     * 获取单条日报详情
     *
     * @param id 日报 ID
     * @return 日报详情
     */
//    @PreAuthorize("hasAuthority('report:view')")
    @GetMapping("/getone/{id}")
    public AjaxResult getReport(@PathVariable Long id) {
        AjaxResult reportDetails = dailyReportService.getReportDetails(id);
        return AjaxResult.success(reportDetails);
    }

    /**
     * 单文件上传
     *
     * @param file 必须传入的文件参数，参数名与前端保持一致
     * @return 上传结果信息
     */
    @PostMapping("/upload-deliverables")
    public AjaxResult uploadFile(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        // 检查文件是否为空
        if (file.isEmpty()) {
            return AjaxResult.error("文件为空，请选择有效文件进行上传");
        }

        // 获取原始文件名
        String originalFileName = file.getOriginalFilename();
        if (originalFileName == null || StringUtils.isBlank(originalFileName)) {
            return AjaxResult.error("文件名为空，请选择有效文件进行上传");
        }

        // 获取当前日期并构造文件存储路径
        String currentDate = LocalDate.now().toString();
        String filePath = Paths.get(uploadDir, currentDate).toString();  // 使用配置文件中的路径

        // 生成唯一的文件存储名
        String uniqueFileName = UUID.randomUUID().toString() + "_" + originalFileName;
        Path dest = Paths.get(filePath, uniqueFileName);

        // 检查并创建文件路径
        File destinationFile = dest.toFile();
        if (!destinationFile.getParentFile().exists() && !destinationFile.getParentFile().mkdirs()) {
            return AjaxResult.error("无法创建文件目录");
        }

        try {
            // 将文件保存到指定路径
            file.transferTo(destinationFile);

            // 构造文件访问URL
            String scheme = request.getScheme();  // 获取协议 (http/https)
            String serverName = request.getServerName();  // 获取服务器名称

            String serverUrl = scheme + "://" + serverName + ":" + "8080";

            // 构造完整的文件 URL
            String fileUrl = serverUrl + "/uploads/" + currentDate + "/" + uniqueFileName;

            // 返回原始文件名和文件访问URL
            Map<String, String> data = new HashMap<>();
            data.put("url", fileUrl);
            data.put("fileName", originalFileName);

            return AjaxResult.success("上传附件成功", data);
        } catch (IOException e) {
            e.printStackTrace();
            return AjaxResult.error("文件上传失败，请重试");
        }
    }


    /**
     * Excel表格数据导出
     * @param file
     * @return
     * @throws Exception
     */
    @PostMapping("/upload-excel")
    public AjaxResult importData(@RequestParam("file") MultipartFile file) throws Exception {
        ExcelUtil<ReportItem> util = new ExcelUtil<>(ReportItem.class);

        // 导入Excel文件并解析为ReportItem列表
        List<ReportItem> reportItemList = util.importExcel(file.getInputStream());

        // 遍历每条数据，计算工时
        for (ReportItem reportItem : reportItemList) {
            try {
                // 计算时间范围对应的工时
                float workHours = TimeRangeUtil.calculateWorkHours(reportItem.getTimeRange());
                reportItem.setWorkHours(workHours); // 设置工时


            } catch (IllegalArgumentException | ParseException e) {
                // 如果时间范围解析失败，可以记录日志或跳过当前记录
                e.printStackTrace();
                return AjaxResult.error("时间范围解析失败：" + reportItem.getTimeRange());
            }
        }

        return AjaxResult.success("Excel数据导入成功", reportItemList);
    }


    @PostMapping("/importTemplate")
    public void importTemplate(HttpServletResponse response)
    {
        ExcelUtil<ReportItem> util = new ExcelUtil<>(ReportItem.class);
        util.importTemplateExcel(response,"用户数据");
    }

}
